//	mpsf.event.h
#pragma once

#define WIN_VERSION
#define _CRT_SECURE_NO_DEPRECATE
#include <max/ext.h>
#include <map>
#include <queue>

typedef struct _evtdata_t
{
	short _argc;
	t_atom *argv;
} t_evtdata;

typedef struct _evtcore_t
{
	t_object _obj;
	//...
} t_evtcore;

typedef struct _evtsrc_t
{
	t_object _obj;
	//...
} t_evtsrc;

//typedef void t_evtdisp;
typedef struct _evtdisp_t t_evtdisp;

typedef struct _evthand_t
{
	t_object _obj;
	t_evtdisp *_disp;
} t_evthand;

typedef std::map<long,t_evthand*> t_hndlist;

typedef struct _evtdisp_t
{
	t_object _obj;
	t_hndlist _hndlist;
	t_hndlist::iterator _hnditr;
	t_evtdata *_evtactive;
	std::queue<t_evtdata*> _evtqueue;
	long _srccount;
} t_evtdisp;

void *evtcore_new(void);
void evtcore_free(t_evtcore *x);

void *evtsrc_new(t_symbol *evtname);
void evtsrc_free(t_evtsrc *x);
void evtsrc_raise(t_evtsrc *x, t_symbol *msg, short argc, t_atom *argv);

void *evthand_new(t_symbol *evtname, long order);
void evthand_free(t_evthand *x);
void evthand_bang(t_evthand *x);
void evthand_cancel(t_evthand *x);

void *evtdisp_new(t_symbol *evtname);
void evtdisp_free(t_evtdisp *x);
void* evtdisp_regsource(t_evtdisp *x);
void evtdisp_unregsource(t_evtdisp *x);
void* evtdisp_reghandler(t_evtdisp *x, t_evthand *hnd, long order);
void evtdisp_unreghandler(t_evtdisp *x, t_evthand *hnd, long order);
void evtdisp_cancel(t_evtdisp *x);
void evtdisp_flusheventqueue(t_evtdisp *x);
void evtdisp_handlerdone(t_evtdisp *x, t_evthand *hnd);


